package com.straw.hat.jdk.jvm.classes;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

public class ClassesObjectTest {
    /*1*/
    /**
     * 相同的Class类型的实例对象只有一个Class对象,每个类型的Class是不一样的
     * @param args
     * @throws ClassNotFoundException
     */
//    public static void main(String[] args) throws ClassNotFoundException {
//        TestObj testObj = new TestObj();
//        System.out.println(TestObj.class == Class.forName("classes.TestObj"));
//        System.out.println(TestObj.class == testObj.getClass());
//        System.out.println(TestObj2.class.equals(TestObj.class));
//
//    }



    /*2*/

    /**
     * 每一个obj会在堆中分配内存 但是对应Class对象就只会分配一个,分配在堆上
     * 一个Class可以对应多个object
     * @param args
     * @throws ClassNotFoundException
     * @throws InterruptedException
     */
//    public static void main(String[] args) throws ClassNotFoundException, InterruptedException {
//        while (true) {
//            ObjTest objTest = new ObjTest();
//            System.out.println("class hash : "+objTest.getClass().hashCode());
//            System.out.println("obj hash : "+objTest.hashCode());
//        }
//    }

    /*3*/
    /**
     * 通过字节码技术创建的类 Class对象不一样 obj对象也不一样
     * 不同class--obj一定不一样的
     * @param args
     *
     */
    public static void main(String[] args) {
        int i = 0;
        while (true) {
            System.out.println(i++);
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(ObjTest.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invokeSuper(o, args));
            Object o = enhancer.create();
            System.out.println("class hash : "+o.getClass().hashCode());
            System.out.println("obj hash : "+o.hashCode());
        }
    }
}
